package plp.imperative2.expression;

import org.joda.time.Period;

public class Duracao {

	protected Period duracao;

	public Duracao(String value) {
		createObject(value);
	}
	
	public Duracao(Period value) {
		this.duracao = value;
	}

	public Period getValue() {
		return this.duracao;
	}
	
	public int getMilisegundos(){
		int dias, horas, minutos, segundos, milisegundos;
		
		dias = getValue().getDays() * 24 * 60 * 60 * 1000;
		horas = getValue().getHours() * 60 * 60 * 1000;
		minutos = getValue().getMinutes() * 60 * 1000;
		segundos = getValue().getSeconds() * 1000;
		milisegundos = getValue().getMillis();
		
		return dias + horas + minutos + segundos + milisegundos;
	}

	private void createObject(String valor) {
		int dias = 0, horas = 0, minutos = 0, segundos = 0, milisegundos = 0;

		// remover cochetes
		valor = valor.replace("[", "");
		valor = valor.replace("]", "");

		if (valor.indexOf(":") != -1) {

			int indiceVirgula = valor.indexOf(',');
			if (indiceVirgula != -1) {
				String diasStr = valor.substring(0, indiceVirgula);
				dias = Integer.parseInt(diasStr);
				valor = valor.substring(indiceVirgula + 1);
			}

			String[] termos = valor.split(":");
			horas = Integer.parseInt(termos[0]);
			minutos = Integer.parseInt(termos[1]);

			if (termos.length > 2) {
				if (termos[2].length() == 2) {
					segundos = Integer.parseInt(termos[2]);
				} else {
					String[] temp = termos[2].split("\\.");
					segundos = Integer.parseInt(temp[0]);
					milisegundos = Integer.parseInt(temp[1]);
				}
			}

		} else {
			int indice = valor.indexOf('d');
			String valorTermo;
			if (indice != -1) {
				valorTermo = valor.substring(0, indice);
				dias = Integer.parseInt(valorTermo);
			}

			indice = valor.indexOf('h');
			if (indice != -1) {
				valorTermo = valor.substring(indice - 2, indice);
				horas = Integer.parseInt(valorTermo);
			}

			indice = valor.indexOf('m');
			if (indice != -1 && (indice != valor.length() - 2)) {
				valorTermo = valor.substring(indice - 2, indice);
				minutos = Integer.parseInt(valorTermo);
			}

			indice = valor.indexOf('s');
			if (indice != -1 && (valor.charAt(indice - 1) != 'm')) {
				valorTermo = valor.substring(indice - 2, indice);
				segundos = Integer.parseInt(valorTermo);
			}

			indice = valor.indexOf("ms");
			if (indice != -1) {
				valorTermo = valor.substring(indice - 3, indice);
				segundos = Integer.parseInt(valorTermo);
			}
		}

		this.duracao = new Period(0, 0, 0, dias, horas, minutos, segundos,
				milisegundos);
	}

	@Override
	public String toString() {
		String format = duracao.toString();
		if (format.indexOf(".") != -1) {
			format = format.toString().replace("P", "").replace("T", "")
					.replace("S", "MS").replace(".", "S");
		} else {
			format = format.toString().replace("P", "").replace("T", "");
		}

		return format;
	}

	@Override
	public boolean equals(Object obj) {
		Duracao duracao = (Duracao) obj;
		return this.duracao.equals(duracao.duracao);
	}
}
